package mybox.engine.servo;

import mybox.engine.Circle;
import mybox.engine.Figur;
import mybox.engine.File4Qcad;
import mybox.engine.Platte;
import mybox.engine.PlatteOO;
import mybox.engine.QVector;
import mybox.engine.Schachtel;
import mybox.engine.heliostat.ZwischenBodenSchachtel;

public class ServoKorpus implements Figur {
	
	
	public static final String intoGrundplatte ="intoGrundPlatte";
	public static final String intoLaengenPlatte ="intoLaengenPlatte";
	File4Qcad file4qcad;
	double laserBreite;
	double materialDicke;
	QVector lowerLeftHole;
	QVector upperLeftHole;
	QVector upperRightHole;
	QVector lowerRightHole;
	QVector center;
	
	QVector lowerLeftEcke;
	QVector rudderCenter;
	QVector gegenAchseCenter;
	public double  gegenAchseRadius;
	
	double langSeiteLochDistance;
	double kurzSeiteLochDistance;
	double lochRadius;
	
	double korpusLaenge;
	double korpusLaengeOhneNase;
	double korpusBreite;
	
	double rudderBefestLochDm;
	double rudderBefestLochRadius;
	
	double rudderZyl2Back;
	double rudderZyl0;
	
	double servoUnterBefestigung;
	
	public double servoProtruding; //soviel wie der Servo rausschaut, nach Montage (mit Rudder)
	
	double abstand2BoxInnenWand;
	public double boxInnenLaenge;
	public double boxInnenBreite;
	public double boxInnenHoehe;
	
	public double diagFromRudderCenter;
	double diagSpace;
	
	
	
	public ServoKorpus(File4Qcad file4qcad, String type, double materialDicke, double laserBreite) {
		
		this.file4qcad=file4qcad;
		this.laserBreite=laserBreite;
		this.materialDicke=materialDicke;
		if (type.equalsIgnoreCase(Servo.S3111)) {
			
			langSeiteLochDistance=43.5;
			kurzSeiteLochDistance=5.75;
			lochRadius=2;      //Servo-Befestigungsloecher am Korpus
			korpusLaenge=41.6; //inklusive DrahtanschlussNase
			
			//Zum rudderCenter Testen:
			//korpusLaenge=40; 
			
			korpusLaengeOhneNase=40; //inklusive DrahtanschlussNase
			korpusBreite=20;
			
			servoUnterBefestigung=26.5;
			
			abstand2BoxInnenWand=4;
			boxInnenLaenge=langSeiteLochDistance+4*lochRadius+2*abstand2BoxInnenWand;
			boxInnenBreite=korpusBreite+2*abstand2BoxInnenWand;
			boxInnenHoehe=servoUnterBefestigung+Servo.fingerRaum;
									
			rudderZyl2Back=27.6;
			rudderZyl0=5.65;		
			servoProtruding=16.7;				
			
		}
		
	}
	
	public void positionIntoServoBox(ZwischenBodenSchachtel servoBox) {
		PlatteOO platte1=servoBox.grundPlatte1;
		lowerLeftHole = new QVector(
				 platte1.ecke[0].x+materialDicke+abstand2BoxInnenWand+lochRadius,
				 platte1.center.y-(kurzSeiteLochDistance)/2-lochRadius				 
		   );
	}
	
	public void positionIntoServoBox(Schachtel servoBox, String plattenTyp) {
		
		Platte platte1=null,platte2=null;
		if (plattenTyp.equalsIgnoreCase(ServoKorpus.intoGrundplatte)) {
			platte1=servoBox.grundPlatte1;
			platte2=servoBox.grundPlatte2;
		}
		
		if (plattenTyp.equalsIgnoreCase(ServoKorpus.intoLaengenPlatte)) {
			platte1=servoBox.laengenPlatte1;
			platte2=servoBox.laengenPlatte2;
		}
		
		 lowerLeftHole = new QVector(
				 platte1.ecke[0].x+materialDicke+abstand2BoxInnenWand+lochRadius,
				 platte1.center.y-(kurzSeiteLochDistance)/2-lochRadius
				 //platte1.ecke[0].y+materialDicke+(boxInnenBreite-kurzSeiteLochDistance-2*lochRadius)/2
		   );
		 
		   
		 upperLeftHole = new QVector(lowerLeftHole.x, lowerLeftHole.y+kurzSeiteLochDistance+2*lochRadius);
		 upperRightHole = new QVector(upperLeftHole.x+langSeiteLochDistance+2*lochRadius, upperLeftHole.y);
		 lowerRightHole = new QVector(lowerLeftHole.x+langSeiteLochDistance+2*lochRadius, lowerLeftHole.y);
		 center = new QVector((lowerLeftHole.x+lowerRightHole.x)/2,
		                         (lowerLeftHole.y+upperLeftHole.y)/2
		                        );
		 
		 lowerLeftEcke = new QVector(center.x-korpusLaengeOhneNase/2,center.y-(korpusBreite/2));
   	  
		 rudderCenter = new QVector(lowerLeftEcke.x+rudderZyl2Back+(rudderZyl0/2),lowerLeftEcke.y+(korpusBreite/2));
			
		  QVector rC2servoBox = new QVector(rudderCenter.x-platte1.ecke[0].x,
					                          rudderCenter.y-platte1.ecke[0].y);
			double rudderCenter2Front=platte1.ecke[1].x-rudderCenter.x;
			double halbePlatte=(platte1.ecke[3].y-platte1.ecke[0].y)/2;
				
			diagFromRudderCenter=java.lang.Math.sqrt(rudderCenter2Front*rudderCenter2Front+halbePlatte*halbePlatte);
					
			
			
			gegenAchseCenter = new QVector(
					platte2.ecke[0].x+rC2servoBox.x,
					platte2.ecke[0].y+rC2servoBox.y
					);
			
			gegenAchseRadius=2.45-2*laserBreite; 
			diagSpace=gegenAchseRadius;
		
	}
	
	public void draw() {
		
		new Circle(file4qcad, lowerLeftHole, lochRadius).draw();  
    	new Circle(file4qcad, upperLeftHole, lochRadius).draw();
    	new Circle(file4qcad, upperRightHole, lochRadius).draw();
    	new Circle(file4qcad, lowerRightHole, lochRadius).draw();
    	
    	
    	QVector lowerLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y-korpusBreite/2);
    	QVector upperLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y+korpusBreite/2);
    	QVector lowerRighthtRectPos = new QVector(center.x+korpusLaenge/2, center.y-korpusBreite/2);
    	
    	QVector vertikale = new QVector(0,korpusBreite);
    	QVector horizontale = new QVector(korpusLaenge,0);
    	
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(upperLeftRectPos));
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerRighthtRectPos));
    
		
	}
	
	public void drawRudderHoleAtBox(ServoRudder rudder) {
    	new Circle(file4qcad,rudderCenter,rudder.mm0/2).draw();    	
    }
    
    public void drawGegenAchse() {
    	new Circle(file4qcad,gegenAchseCenter,gegenAchseRadius).draw();
    }
	

}
